package com.xiaoming.e3mall.cart.service;

import com.xiaoming.e3mall.CartService;
import com.xiaoming.e3mall.common.jedis.JedisClient;
import com.xiaoming.e3mall.common.utils.E3Result;
import com.xiaoming.e3mall.common.utils.JsonUtils;
import com.xiaoming.e3mall.mapper.TbItemMapper;
import com.xiaoming.e3mall.pojo.TbItem;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 购物车处理服务
 */

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private JedisClient jedisClient;
    @Autowired
    private TbItemMapper itemMapper;
    @Value("${REDIS_CART_PRE}")
    private String REDIS_CART_PRE;


    /**
     * 像redis中添加购物车
     */
    @Override
    public E3Result addCart(long userId, long itemId, int num) {

        //判断商品是否存在
        Boolean hexists = jedisClient.hexists(REDIS_CART_PRE + ":" + userId, itemId + "");
        //如果存在数量相加
        if (hexists) {
            String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
            //将json转成Tbitem对象
            TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
            item.setNum(item.getNum() + num);
            //重新写会redis
            jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(item));
            //返回结果
            return E3Result.ok();
        }

        //redis中不存在,从数据库中查询信息
        TbItem item = itemMapper.selectByPrimaryKey(itemId);
        //设置购物车中 商品的数量
        item.setNum(num);
        //取一张图片
        String image = item.getImage();
        if (StringUtils.isNotBlank(image))
            item.setImage(image.split(",")[0]);
        //将购物车中新添加的商品的信息添加到reids中
        jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(item));

        //返回结果
        return E3Result.ok();
    }

    /**
     * 合并cookie中的跟redis中的购物车列表 同步到redis中
     */
    @Override
    public E3Result mergeCart(Long userId, List<TbItem> itemList) {
        //遍历商品列表
        //把列表添加到购物车。
        //判断购物车中是否有此商品
        //如果有，数量相加
        //如果没有添加新的商品
        for (TbItem tbItem : itemList) {
            addCart(userId, tbItem.getId(), tbItem.getNum());
        }
        //返回成功
        return E3Result.ok();
    }


    /**
     * 获取购物车列表
     */
    @Override
    public List<TbItem> getCartList(long userId) {
        //根据用户id查询购车列表
        List<String> jsonList = jedisClient.hvals(REDIS_CART_PRE + ":" + userId);
        List<TbItem> itemList = new ArrayList<>();
        for (String string : jsonList) {
            //创建一个TbItem对象
            TbItem item = JsonUtils.jsonToPojo(string, TbItem.class);
            //添加到列表
            itemList.add(item);
        }
        return itemList;
    }

    /**
     * 更新购物车中商品的数量
     */
    @Override
    public E3Result updateCartNum(long userId, long itemId, int num) {
        //先从redis中查出该商品
        String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
        //将该商品的数量更新
        TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
        item.setNum(num);
        //写入redis
        jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(item));
        //返回结果
        return E3Result.ok();
    }

    /**
     * 删除购物车中的商品
     */
    @Override
    public E3Result deleteCartItem(long userId, long itemId) {
        // 删除购物车商品
        jedisClient.hdel(REDIS_CART_PRE + ":" + userId, itemId + "");
        return E3Result.ok();
    }

    /**
     * 清空购物车
     */
    @Override
    public E3Result clearCartItem(Long userId) {
        //删除购物车信息
        jedisClient.del(REDIS_CART_PRE + ":" + userId);
        return E3Result.ok();
    }

}
